package ctrl;

import java.awt.Desktop;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import vista.Principal;

import com.mysql.jdbc.exceptions.MySQLDataException;

import bd.MySQL;

public class Monitoreo extends Thread {

	private boolean isRunning;
	private int tiempo;
	private ArrayList<String> colaAnterior, colaActual;
	private Principal ventanaPrincipal;

	public Monitoreo(Principal ventanaPrincipal) {
		colaActual = new ArrayList<String>();
		this.ventanaPrincipal = ventanaPrincipal;
		isRunning = false;
		tiempo = Integer.parseInt(Ctrl.getTiempoEsperaMySQL());
		if (MySQL.abrirConexion()) {
			colaAnterior = MySQL.getCola();
			MySQL.cerrarConexion();
		} else {
			ventanaPrincipal
					.mostrarMensaje(
							"Hubo un problema al intentar conectarse con el servidor de MySQL",
							'E');
		}
	}
	
	public void setIsRunning(boolean isRunning) {
		this.isRunning = isRunning;
	}

	@Override
	public void run() {
		if (isRunning == false) {
			ventanaPrincipal.limpiarMenuActionPerformed(null);
			isRunning = true;
			ventanaPrincipal.cambiarIcono('v');
			int tiempoTemp = tiempo;			
			boolean iguales = false;
			inicializarColaAnterior();
			while (isRunning) {
				if (tiempoTemp <= 0) {
					tiempoTemp = tiempo;
					ventanaPrincipal.cambiarContador(tiempoTemp);
					iguales = comparar();
					ventanaPrincipal.cambiarTextoConsola(colaActual);
					if(iguales) {
						ventanaPrincipal.cambiarIcono('o');
						enviarCorreo();
						ventanaPrincipal.aumentarContadorCorreo();
						if(ventanaPrincipal.getContadorCorreo() > 2) {
							abrirSAM();
						}
					}

				} else {
					tiempoTemp--;
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					ventanaPrincipal.cambiarContador(tiempoTemp);
					tiempoTemp--;
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					ventanaPrincipal.cambiarContador(tiempoTemp);
				}

			}

		}

	}

	private void abrirSAM() {
		try {
			Desktop.getDesktop().open(new File(Ctrl.getRutaSAM()));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			ventanaPrincipal.mostrarMensaje("El archivo SAMBC.exe no pudo ser encontrado", 'E');
			e.printStackTrace();
		}		
	}

	private boolean enviarCorreo() {
		String mensaje = Ctrl.enviarCorreo();
		if(mensaje != null) {
			//ventanaPrincipal.mostrarMensaje(mensaje, 'E');
			return true;
		}
		return false;
	}
	
	private void inicializarColaAnterior(){
		if (MySQL.abrirConexion()) {
			colaAnterior = MySQL.getCola();
			MySQL.cerrarConexion();
			ventanaPrincipal.cambiarTextoConsola(colaAnterior);
		} else {
			ventanaPrincipal.mostrarMensaje("Hubo un problema al intentar conectarse con el servidor de MySQL", 'E');
			
		}
	}

	/**
	 * 
	 * @return Retorna verdadero si son iguales. Retorna falso en caso
	 *         contrario.
	 */
	private boolean comparar() {
		if (MySQL.abrirConexion()) {
			
			colaActual.clear();
			colaActual = MySQL.getCola();
			MySQL.cerrarConexion();
			if(colaActual.size() != colaAnterior.size()) {
				colaAnterior = colaActual;
				return false;
			}			
			for(int c = 0; c < colaActual.size(); c++) {
				if(!colaActual.get(c).equals(colaAnterior.get(c))) {
					return false;
				}
			}
			return true;
		} else {
			ventanaPrincipal.mostrarMensaje("Hubo un problema al intentar conectarse con el servidor de MySQL", 'E');
			return false;
		}
	}
}
